#可变长度参数(*与**的用法)
#*形参名:用来接收溢出的位置实参
# def func(x,y,*z):#溢出的位置实参会被*保存成元祖格式然后赋值给紧跟其后的形参名
#     print(x,y,z)
# func(1,2,3,4,5,6)    1 2 (3, 4, 5, 6)
def my_sum(*args):
    res=0
    for item in args:
        res+=item
    return res
res=my_sum(1,2,3,4,)
print(res)
#**形参名:用来接收溢出的关键字实参，**会将溢出的关键字实参保存成字典格式，然后赋值个紧跟其后的形参名
def func1(x,y,**kwargs):
    print(x,y,kwargs)
func1(1,y=2,a=1,b=2,c=3)

#II:*可以用在实参中,实参中带*，先把*后的值打散成位置实参，*后可以被for循环一一输出
def func2(x,y,z):
    print(x,y,z)
func2(*[11,22,33])# func2(11,22,33)   11 22 33
#III:形参与实参都带 *
def func3(x,y,*args):
    print(x,y,args)
func3(1,2,[3,4,5,6])
func3(1,2,*[3,4,5,6])#func3(1,2,3,4,5,6)
func3(*'hello')#h e ('l', 'l', 'o')

#**可以用在实参中,实参中带**，先把**后的值打散成关键字实参
def func4(x,y,z):
    print(x,y,z)
func4(*{'x':1,'y':2,'z':3})#func4('x':1,'y':2,'z':3)
func4(**{'x':1,'y':2,'z':3})#func(x=1,y=2,z=3)
#func4(**{'x':1,'a':2,'z':3})#TypeError: func4() got an unexpected keyword argument 'a'

def func5(x,y,**kwargs):
    print(x,y,kwargs)
func5(**{'y':222,'x':111,'a':333,'b':4444})#111 222 {'a': 333, 'b': 4444}
print(func5(**{'y':222,'x':111,'a':333,'b':4444}))
